//Dijkstra
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=1050;
const int INF=100000050;
int vis[MAXN];
int cost[MAXN][MAXN];
int lowcost[MAXN];
int D[MAXN];
int u,v,c,sa;
int main(void){
	int t,s,d;
	while(~scanf("%d%d%d",&t,&s,&d)){
		for(int i=0;i<MAXN;i++){
			lowcost[i]=INF;
			vis[i]=false;
			for(int j=0;j<MAXN;j++){
				if(i==j){
					cost[i][j]=0;
				}
				cost[i][j]=INF;
			}
		}
		lowcost[0]=0;
		int ma;
		for(int i=0;i<t;i++){
			scanf("%d%d%d",&u,&v,&c);
			ma=max(ma,max(u,v));
			if(c<cost[u][v]){
				cost[u][v]=cost[v][u]=c;
			}
		}
		for(int i=0;i<s;i++){
			scanf("%d",&sa);
			cost[0][sa]=cost[sa][0]=0;
			lowcost[sa]=0;
		}
		for(int i=0;i<d;i++){
			scanf("%d",&D[i]);
		}
		for(int i=0;i<=ma;i++){
			int k=-1;
			int MIN=INF;
			for(int j=0;j<=ma;j++){
				if(!vis[j] && lowcost[j]<MIN){
					MIN=lowcost[j];
					k=j;
				}
			}
			if(k==-1){
				break;
			}
			vis[k]=true;
			for(int j=0;j<=ma;j++){
				if(!vis[j] && lowcost[k]+cost[k][j]<lowcost[j]){
					lowcost[j]=lowcost[k]+cost[k][j];
				}
			}
		}
		/*
		for(int i=0;i<=ma;i++){
			printf("%d ",lowcost[i]);
		}
		printf("\n");
		*/
		int ans=INF;
		for(int i=0;i<d;i++){
			ans=min(ans,lowcost[D[i]]);
		}
		printf("%d\n",ans);
	}
	return 0;
}


/*
//Floyd
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=1050;
const int INF=1000050;
int m[MAXN][MAXN];
int S[MAXN];
int D[MAXN];
int main(void){
	int t,s,d;
	int u,v,c;
	int ma=0;
	while(~scanf("%d%d%d",&t,&s,&d)){
		//初始化，注意i==j要初始化为0 节点到本身的距离为0
		for(int i=0;i<MAXN;i++){
			for(int j=0;j<=MAXN;j++){
				if(i==j){
					m[i][j]=0;
				}
				else{
					m[i][j]=INF;
				}
			}
		}
		for(int i=0;i<t;i++){
			scanf("%d%d%d",&u,&v,&c);
			//记录最大节点
			ma=max(ma,max(u,v));
			if(c<m[u][v]){
				m[u][v]=m[v][u]=c;
			}
		}
		for(int i=0;i<s;i++){
			scanf("%d",&S[i]);
		}
		for(int i=0;i<d;i++){
			scanf("%d",&D[i]);
		}
		for(int k=1;k<=ma;k++){
			for(int i=1;i<=ma;i++){
				//这里优化，如果i k无通路，省去一个循环
				if(m[i][k]==INF){
					continue;
				}
				for(int j=1;j<=ma;j++){
					m[i][j]=min(m[i][j],m[i][k]+m[k][j]);
				}
			}
		}
		int mcost=INF;
		for(int i=0;i<s;i++){
			for(int j=0;j<d;j++){
				mcost=min(mcost,m[S[i]][D[j]]);
			}
		}
		printf("%d\n",mcost);
	}
    return 0;
}
*/